package com.rw.tool.util.io.file.json;

import com.rw.tool.util.io.file.exception.SingleDBException;
import com.rw.tool.util.io.file.property.NewInstance;
import com.rw.tool.util.io.file.wrapper.FileQueryWrapper;

import java.io.File;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 单个文件存储，在没有多个文件存储需求的时候
 * 使用SingleJsonFileDB可以屏蔽掉不需要的多余的操作
 *
 * @param <T> javabean的类别
 */
public class SingleJsonFileDB<T> extends JsonFileDB<T> {
    /**
     * 单个文件存储的文件名
     */
    public static final String FILE_NAME = "singleJson";

    /**
     * 构造单个文件存储器
     *
     * @param workPath 工作目录
     * @param tClass   javabean的类对象
     */
    public SingleJsonFileDB(File workPath, Class<T> tClass) {
        super(workPath, tClass, new SingleJsonBeanParser<>());
    }


    /**
     * 构造单个文件存储器
     *
     * @param tClass javabean的类对象
     */
    public SingleJsonFileDB(Class<T> tClass) {
        super(tClass, new SingleJsonBeanParser<>());
    }


    /**
     * 构造单个文件存储器
     *
     * @param workPath    工作目录
     * @param tClass      javabean的类对象
     * @param newInstance javabean的创建新对象的方法
     */
    public SingleJsonFileDB(File workPath, Class<T> tClass, NewInstance<T> newInstance) {
        super(workPath, tClass, new SingleJsonBeanParser<>(), newInstance);
    }

    /**
     * 构造单个文件存储器
     *
     * @param tClass      javabean的类对象
     * @param newInstance javabean的创建新对象的方法
     */
    public SingleJsonFileDB(Class<T> tClass, NewInstance<T> newInstance) {
        super(tClass, new SingleJsonBeanParser<>(), newInstance);
    }

    /**
     * 获得对象对应的正确的文件名
     *
     * @param bean 对象
     * @return 文件名字
     */
    @Override
    public String getFileName(T bean) {
        return SingleJsonFileDB.FILE_NAME + suffix;
    }

    /**
     * 根据id获得文件名
     *
     * @param id id
     * @return 文件名字
     */
    @Override
    public String getFileNameById(Object id) {
        return SingleJsonFileDB.FILE_NAME + suffix;
    }

    /**
     * 插入所有数据，在单个文件存储器里禁止使用该方法
     *
     * @param dataList 数据
     */
    @Override
    public void insertAll(Collection<T> dataList) {
        String errorMsg = "SingleFileDB can not insert all!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 根据ID删除数据
     * 在单个文件存储器里禁止使用该方法
     *
     * @param id id
     */
    @Override
    public void deleteById(Object id) {
        String errorMsg = "SingleFileDB can not delete by id!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 删除这个文件
     */
    public void delete() {
        super.deleteById(FILE_NAME);
    }

    /**
     * 删除所有数据，在单个文件存储器里禁止使用该方法
     */
    @Override
    public void deleteAll() {
        String errorMsg = "SingleFileDB can not delete all!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 根据条件删除数据，在单个文件存储器里禁止使用该方法
     *
     * @param queryWrapper 条件
     */
    @Override
    public void delete(FileQueryWrapper queryWrapper) {
        String errorMsg = "SingleFileDB can not delete by queryWrapper!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 根据ID更新数据，在单个文件存储器里禁止使用该方法
     *
     * @param queryWrapper 更新条件
     */
    @Override
    public void update(FileQueryWrapper queryWrapper, T data) {
        String errorMsg = "SingleFileDB can not update by queryWrapper!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 更新这个文件的对象
     *
     * @param data 更新的对象
     */
    public void update(T data) {
        super.update(null, data);
    }

    /**
     * 根据ID查询数据
     * ，在单个文件存储器里禁止使用该方法
     *
     * @param id id
     * @return 查询出来的数据
     */
    @Override
    public T selectById(Serializable id) {
        String errorMsg = "SingleFileDB can not select by id!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 根据条件查询数据，在单个文件存储器里禁止使用该方法
     *
     * @param queryWrapper 查询条件
     * @return 查询出来的数据
     */
    @Override
    public T selectOne(FileQueryWrapper queryWrapper) {
        String errorMsg = "SingleFileDB can not select by queryWrapper!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 根据条件查询数据，在单个文件存储器里禁止使用该方法
     *
     * @param queryWrapper 查询条件
     * @return 查询出来的据
     */
    @Override
    public List<T> selectList(FileQueryWrapper queryWrapper) {
        String errorMsg = "SingleFileDB can not select by queryWrapper!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 查询所有数据，在单个文件存储器里禁止使用该方法
     *
     * @return 所有数据
     */
    @Override
    public List<T> selectAll() {
        String errorMsg = "SingleFileDB can not select all!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 根据所有ID查询数据，在单个文件存储器里禁止使用该方法
     *
     * @param idList id列表
     * @return 查询出来的数据
     */
    @Override
    public List<T> selectList(Collection<? extends Serializable> idList) {
        String errorMsg = "SingleFileDB can not select by id list!";
        throw new SingleDBException(errorMsg);
    }

    /**
     * 把这个文件查询出来
     *
     * @return 文件对象
     */
    public T select() {
        return super.selectById(FILE_NAME);
    }
}
